#include <stdio.h>
#include <stdlib.h>
#include "ListeVaissE.h"

void initListeVaissE(ListeVaissE *l, Terrain *ter)
{
    l->adPremiere = (CelluleVaissE*)malloc(sizeof (CelluleVaissE));
    l->adPremiere->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi1(l->adPremiere->vaiss, ter, 35, 2);
    l->adPremiere->vaisSuiv = NULL;
    l->adPremiere->vaisPrec = NULL;
    l->nbCellule = 1;
}

void initListeVaissEN(ListeVaissE *l, Terrain *ter)
{
    l->adPremiere = (CelluleVaissE*)malloc(sizeof (CelluleVaissE));
    l->adPremiere->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi1N(l->adPremiere->vaiss, ter, 75, 2);
    l->adPremiere->vaisSuiv = NULL;
    l->adPremiere->vaisPrec = NULL;
    l->nbCellule = 1;
}

/*--------------- Fonction ajoute vaisseau ----------------*/
void ajouteVaissEN(ListeVaissE *lVaissE,  Terrain *ter, int posy)
{
    CelluleVaissE *newVaiss;
    //on initialise et alloue de la place pour le vaisseau
    newVaiss = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi1N(newVaiss->vaiss, ter, 75,posy);

    //Si la liste est vide
    if(lVaissE->adPremiere == NULL)
    {
        newVaiss->vaisPrec = NULL;
        newVaiss->vaisSuiv = NULL;
        lVaissE->adPremiere = newVaiss;
    }
    else
    {
        CelluleVaissE *temp = lVaissE->adPremiere;
        //On va en fin de liste
        while (temp->vaisSuiv!= NULL)
        {
            temp = temp->vaisSuiv;
        }
        //on met le vaisseau en fin de liste
        temp->vaisSuiv = newVaiss;
        newVaiss->vaisPrec = temp;
        newVaiss->vaisSuiv = NULL;
    }
    lVaissE->nbCellule++;
}

void ajouteVaissE(ListeVaissE *lVaissE,  Terrain *ter, int posy)
{
    CelluleVaissE *newVaiss;
    //on initialise et alloue de la place pour le vaisseau
    newVaiss = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi1(newVaiss->vaiss, ter, 35,posy);

    //Si la liste est vide
    if(lVaissE->adPremiere == NULL)
    {
        newVaiss->vaisPrec = NULL;
        newVaiss->vaisSuiv = NULL;
        lVaissE->adPremiere = newVaiss;
    }
    else
    {
        CelluleVaissE *temp = lVaissE->adPremiere;
        //On va en fin de liste
        while (temp->vaisSuiv!= NULL)
        {
            temp = temp->vaisSuiv;
        }
        //on met le vaisseau en fin de liste
        temp->vaisSuiv = newVaiss;
        newVaiss->vaisPrec = temp;
        newVaiss->vaisSuiv = NULL;
    }
    lVaissE->nbCellule++;
}

void ajouteVaissE2(ListeVaissE *lVaissE,  Terrain *ter, int posy)
{
    CelluleVaissE *newVaiss;
    //on initialise et alloue de la place pour le vaisseau
    newVaiss = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi2(newVaiss->vaiss, ter, 35,posy);

    //Si la liste est vide
    if(lVaissE->adPremiere == NULL)
    {
        newVaiss->vaisPrec = NULL;
        newVaiss->vaisSuiv = NULL;
        lVaissE->adPremiere = newVaiss;
    }
    else
    {
        CelluleVaissE *temp = lVaissE->adPremiere;
        //On va en fin de liste
        while (temp->vaisSuiv!= NULL)
        {
            temp = temp->vaisSuiv;
        }
        //on met le vaisseau en fin de liste
        temp->vaisSuiv = newVaiss;
        newVaiss->vaisPrec = temp;
        newVaiss->vaisSuiv = NULL;
    }
    lVaissE->nbCellule++;
}

void ajouteVaissE3(ListeVaissE *lVaissE,  Terrain *ter, int posy)
{
    CelluleVaissE *newVaiss;
    //on initialise et alloue de la place pour le vaisseau
    newVaiss = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi3(newVaiss->vaiss, ter, 35,posy);

    //Si la liste est vide
    if(lVaissE->adPremiere == NULL)
    {
        newVaiss->vaisPrec = NULL;
        newVaiss->vaisSuiv = NULL;
        lVaissE->adPremiere = newVaiss;
    }
    else
    {
        CelluleVaissE *temp = lVaissE->adPremiere;
        //On va en fin de liste
        while (temp->vaisSuiv!= NULL)
        {
            temp = temp->vaisSuiv;
        }
        //on met le vaisseau en fin de liste
        temp->vaisSuiv = newVaiss;
        newVaiss->vaisPrec = temp;
        newVaiss->vaisSuiv = NULL;
    }
    lVaissE->nbCellule++;
}

void ajouteVaissE4(ListeVaissE *lVaissE,  Terrain *ter, int posy)
{
    CelluleVaissE *newVaiss;
    //on initialise et alloue de la place pour le vaisseau
    newVaiss = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi4(newVaiss->vaiss, ter, 36,posy);

    //Si la liste est vide
    if(lVaissE->adPremiere == NULL)
    {
        newVaiss->vaisPrec = NULL;
        newVaiss->vaisSuiv = NULL;
        lVaissE->adPremiere = newVaiss;
    }
    else
    {
        CelluleVaissE *temp = lVaissE->adPremiere;
        //On va en fin de liste
        while (temp->vaisSuiv!= NULL)
        {
            temp = temp->vaisSuiv;
        }
        //on met le vaisseau en fin de liste
        temp->vaisSuiv = newVaiss;
        newVaiss->vaisPrec = temp;
        newVaiss->vaisSuiv = NULL;
    }
    lVaissE->nbCellule++;
}

void ajouteVaissE5(ListeVaissE *lVaissE,  Terrain *ter, int posx)
{
    CelluleVaissE *newVaiss;
    //on initialise et alloue de la place pour le vaisseau
    newVaiss = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initEnnemi5(newVaiss->vaiss, ter, posx,10);

    //Si la liste est vide
    if(lVaissE->adPremiere == NULL)
    {
        newVaiss->vaisPrec = NULL;
        newVaiss->vaisSuiv = NULL;
        lVaissE->adPremiere = newVaiss;
    }
    else
    {
        CelluleVaissE *temp = lVaissE->adPremiere;
        //On va en fin de liste
        while (temp->vaisSuiv!= NULL)
        {
            temp = temp->vaisSuiv;
        }
        //on met le vaisseau en fin de liste
        temp->vaisSuiv = newVaiss;
        newVaiss->vaisPrec = temp;
        newVaiss->vaisSuiv = NULL;
    }
    lVaissE->nbCellule++;
}

void ajouteBoss1(ListeVaissE *lVaissE,  Terrain *ter, int posy)
{
    CelluleVaissE *newVaiss;
    CelluleVaissE *newVaiss2;
    //on initialise et alloue de la place pour le vaisseau
    newVaiss = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    newVaiss2 = (CelluleVaissE *)malloc(sizeof (CelluleVaissE));
    newVaiss2->vaiss = (VaisseauEnnemi *)malloc(sizeof (VaisseauEnnemi));
    initBoss1(newVaiss->vaiss, ter,0, 0);
    initBoss2(newVaiss2->vaiss, ter, ter->dimx/2-4, 6);

    //Si la liste est vide
    if(lVaissE->adPremiere == NULL)
    {
        newVaiss->vaisPrec = NULL;
        newVaiss->vaisSuiv = NULL;
        lVaissE->adPremiere = newVaiss;
    }
    else
    {
        CelluleVaissE *temp = lVaissE->adPremiere;
        //On va en fin de liste
        while (temp->vaisSuiv!= NULL)
        {
            temp = temp->vaisSuiv;
        }
        //on met le vaisseau en fin de liste
        temp->vaisSuiv = newVaiss;
        newVaiss->vaisPrec = temp;
        newVaiss->vaisSuiv = newVaiss2;

        newVaiss2->vaisPrec = newVaiss;
        newVaiss2->vaisSuiv = NULL;
    }
    lVaissE->nbCellule+=2;

}


/*--------------- Fin fonctions ajoute vaisseau ----------------*/

void nombreVaissE(ListeVaissE *l, Terrain *ter,int nb)
{
    int i;
    int posy = 2;
    for(i=0;i<nb;i++)
    {
        ajouteVaissEN(l, ter, posy);
        posy++;
        if(posy>8)
        {
            posy = 2;
        }
    }
}

CelluleVaissE finListe(ListeVaissE *l)
{
    CelluleVaissE *temp = l->adPremiere;

    while(temp->vaisSuiv != NULL)
    {
        temp = temp->vaisSuiv;
    }
    return *temp;
}


/* ---------------------- Fonctions de libération de la mémoire -------------------------- */

void supprListeVaissE(ListeVaissE * l)
{
	CelluleVaissE *temp = l->adPremiere;

	if(temp != NULL)
	{
		l->adPremiere = l->adPremiere->vaisSuiv;

		if(l->adPremiere  != NULL)
		{
			l->adPremiere->vaisPrec = NULL;
        }
	}

    temp->vaisSuiv = NULL;
	free(temp);

}

void videListeVaissE(ListeVaissE * l)
{
	while(l->adPremiere != NULL)
	{
		supprListeVaissE(l);
	}
}

void testamentVaissE(ListeVaissE * l)

{
	videListeVaissE(l);
}
